home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / compiler / transformer.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  42KB  |  1,465 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Parse tree transformation module.
  5.  
  6. Transforms Python source code into an abstract syntax tree (AST)
  7. defined in the ast module.
  8.  
  9. The simplest ways to invoke this module are via parse and parseFile.
  10. parse(buf) -> AST
  11. parseFile(path) -> AST
  12. '''
  13. from compiler.ast import *
  14. import parser
  15. import symbol
  16. import token
  17. import sys
  18.  
  19. class WalkerError(StandardError):
  20.     pass
  21.  
  22. from consts import CO_VARARGS, CO_VARKEYWORDS
  23. from consts import OP_ASSIGN, OP_DELETE, OP_APPLY
  24.  
  25. def parseFile(path):
  26.     f = open(path, 'U')
  27.     src = f.read() + '\n'
  28.     f.close()
  29.     return parse(src)
  30.  
  31.  
  32. def parse(buf, mode = 'exec'):
  33.     if mode == 'exec' or mode == 'single':
  34.         return Transformer().parsesuite(buf)
  35.     elif mode == 'eval':
  36.         return Transformer().parseexpr(buf)
  37.     else:
  38.         raise ValueError("compile() arg 3 must be 'exec' or 'eval' or 'single'")
  39.  
  40.  
  41. def asList(nodes):
  42.     l = []
  43.     for item in nodes:
  44.         if hasattr(item, 'asList'):
  45.             l.append(item.asList())
  46.             continue
  47.         if type(item) is type((None, None)):
  48.             l.append(tuple(asList(item)))
  49.             continue
  50.         if type(item) is type([]):
  51.             l.append(asList(item))
  52.             continue
  53.         l.append(item)
  54.     
  55.     return l
  56.  
  57.  
  58. def extractLineNo(ast):
  59.     if not isinstance(ast[1], tuple):
  60.         return ast[2]
  61.     
  62.     for child in ast[1:]:
  63.         if isinstance(child, tuple):
  64.             lineno = extractLineNo(child)
  65.             if lineno is not None:
  66.                 return lineno
  67.             
  68.         lineno is not None
  69.     
  70.  
  71.  
  72. def Node(*args):
  73.     kind = args[0]
  74.     if nodes.has_key(kind):
  75.         
  76.         try:
  77.             return nodes[kind](*args[1:])
  78.         except TypeError:
  79.             print nodes[kind], len(args), args
  80.             raise 
  81.         except:
  82.             None<EXCEPTION MATCH>TypeError
  83.         
  84.  
  85.     None<EXCEPTION MATCH>TypeError
  86.     raise WalkerError, "Can't find appropriate Node type: %s" % str(args)
  87.  
  88.  
  89. class Transformer:
  90.     '''Utility object for transforming Python parse trees.
  91.  
  92.     Exposes the following methods:
  93.         tree = transform(ast_tree)
  94.         tree = parsesuite(text)
  95.         tree = parseexpr(text)
  96.         tree = parsefile(fileob | filename)
  97.     '''
  98.     
  99.     def __init__(self):
  100.         self._dispatch = { }
  101.         for value, name in symbol.sym_name.items():
  102.             if hasattr(self, name):
  103.                 self._dispatch[value] = getattr(self, name)
  104.                 continue
  105.         
  106.         self._dispatch[token.NEWLINE] = self.com_NEWLINE
  107.         self._atom_dispatch = {
  108.             token.LPAR: self.atom_lpar,
  109.             token.LSQB: self.atom_lsqb,
  110.             token.LBRACE: self.atom_lbrace,
  111.             token.BACKQUOTE: self.atom_backquote,
  112.             token.NUMBER: self.atom_number,
  113.             token.STRING: self.atom_string,
  114.             token.NAME: self.atom_name }
  115.         self.encoding = None
  116.  
  117.     
  118.     def transform(self, tree):
  119.         '''Transform an AST into a modified parse tree.'''
  120.         if not isinstance(tree, tuple) or isinstance(tree, list):
  121.             tree = parser.ast2tuple(tree, line_info = 1)
  122.         
  123.         return self.compile_node(tree)
  124.  
  125.     
  126.     def parsesuite(self, text):
  127.         '''Return a modified parse tree for the given suite text.'''
  128.         return self.transform(parser.suite(text))
  129.  
  130.     
  131.     def parseexpr(self, text):
  132.         '''Return a modified parse tree for the given expression text.'''
  133.         return self.transform(parser.expr(text))
  134.  
  135.     
  136.     def parsefile(self, file):
  137.         '''Return a modified parse tree for the contents of the given file.'''
  138.         if type(file) == type(''):
  139.             file = open(file)
  140.         
  141.         return self.parsesuite(file.read())
  142.  
  143.     
  144.     def compile_node(self, node):
  145.         n = node[0]
  146.         if n == symbol.encoding_decl:
  147.             self.encoding = node[2]
  148.             node = node[1]
  149.             n = node[0]
  150.         
  151.         if n == symbol.single_input:
  152.             return self.single_input(node[1:])
  153.         
  154.         if n == symbol.file_input:
  155.             return self.file_input(node[1:])
  156.         
  157.         if n == symbol.eval_input:
  158.             return self.eval_input(node[1:])
  159.         
  160.         if n == symbol.lambdef:
  161.             return self.lambdef(node[1:])
  162.         
  163.         if n == symbol.funcdef:
  164.             return self.funcdef(node[1:])
  165.         
  166.         if n == symbol.classdef:
  167.             return self.classdef(node[1:])
  168.         
  169.         raise WalkerError, ('unexpected node type', n)
  170.  
  171.     
  172.     def single_input(self, node):
  173.         n = node[0][0]
  174.         if n != token.NEWLINE:
  175.             return self.com_stmt(node[0])
  176.         
  177.         return Pass()
  178.  
  179.     
  180.     def file_input(self, nodelist):
  181.         doc = self.get_docstring(nodelist, symbol.file_input)
  182.         if doc is not None:
  183.             i = 1
  184.         else:
  185.             i = 0
  186.         stmts = []
  187.         for node in nodelist[i:]:
  188.             if node[0] != token.ENDMARKER and node[0] != token.NEWLINE:
  189.                 self.com_append_stmt(stmts, node)
  190.                 continue
  191.         
  192.         return Module(doc, Stmt(stmts))
  193.  
  194.     
  195.     def eval_input(self, nodelist):
  196.         return Expression(self.com_node(nodelist[0]))
  197.  
  198.     
  199.     def decorator_name(self, nodelist):
  200.         listlen = len(nodelist)
  201.         if not listlen >= 1 or listlen % 2 == 1:
  202.             raise AssertionError
  203.         item = self.atom_name(nodelist)
  204.         i = 1
  205.         while i < listlen:
  206.             if not nodelist[i][0] == token.DOT:
  207.                 raise AssertionError
  208.             if not nodelist[i + 1][0] == token.NAME:
  209.                 raise AssertionError
  210.             item = Getattr(item, nodelist[i + 1][1])
  211.             i += 2
  212.         return item
  213.  
  214.     
  215.     def decorator(self, nodelist):
  216.         if not len(nodelist) in (3, 5, 6):
  217.             raise AssertionError
  218.         if not nodelist[0][0] == token.AT:
  219.             raise AssertionError
  220.         if not nodelist[-1][0] == token.NEWLINE:
  221.             raise AssertionError
  222.         if not nodelist[1][0] == symbol.dotted_name:
  223.             raise AssertionError
  224.         funcname = self.decorator_name(nodelist[1][1:])
  225.         if len(nodelist) > 3:
  226.             if not nodelist[2][0] == token.LPAR:
  227.                 raise AssertionError
  228.             expr = self.com_call_function(funcname, nodelist[3])
  229.         else:
  230.             expr = funcname
  231.         return expr
  232.  
  233.     
  234.     def decorators(self, nodelist):
  235.         items = []
  236.         for dec_nodelist in nodelist:
  237.             if not dec_nodelist[0] == symbol.decorator:
  238.                 raise AssertionError
  239.             items.append(self.decorator(dec_nodelist[1:]))
  240.         
  241.         return Decorators(items)
  242.  
  243.     
  244.     def funcdef(self, nodelist):
  245.         if len(nodelist) == 6:
  246.             if not nodelist[0][0] == symbol.decorators:
  247.                 raise AssertionError
  248.             decorators = self.decorators(nodelist[0][1:])
  249.         elif not len(nodelist) == 5:
  250.             raise AssertionError
  251.         decorators = None
  252.         lineno = nodelist[-4][2]
  253.         name = nodelist[-4][1]
  254.         args = nodelist[-3][2]
  255.         if args[0] == symbol.varargslist:
  256.             (names, defaults, flags) = self.com_arglist(args[1:])
  257.         else:
  258.             names = defaults = ()
  259.             flags = 0
  260.         doc = self.get_docstring(nodelist[-1])
  261.         code = self.com_node(nodelist[-1])
  262.         if doc is not None:
  263.             if not isinstance(code, Stmt):
  264.                 raise AssertionError
  265.             if not isinstance(code.nodes[0], Discard):
  266.                 raise AssertionError
  267.             del code.nodes[0]
  268.         
  269.         return Function(decorators, name, names, defaults, flags, doc, code, lineno = lineno)
  270.  
  271.     
  272.     def lambdef(self, nodelist):
  273.         if nodelist[2][0] == symbol.varargslist:
  274.             (names, defaults, flags) = self.com_arglist(nodelist[2][1:])
  275.         else:
  276.             names = defaults = ()
  277.             flags = 0
  278.         code = self.com_node(nodelist[-1])
  279.         return Lambda(names, defaults, flags, code, lineno = nodelist[1][2])
  280.  
  281.     
  282.     def classdef(self, nodelist):
  283.         name = nodelist[1][1]
  284.         doc = self.get_docstring(nodelist[-1])
  285.         if nodelist[2][0] == token.COLON:
  286.             bases = []
  287.         else:
  288.             bases = self.com_bases(nodelist[3])
  289.         code = self.com_node(nodelist[-1])
  290.         if doc is not None:
  291.             if not isinstance(code, Stmt):
  292.                 raise AssertionError
  293.             if not isinstance(code.nodes[0], Discard):
  294.                 raise AssertionError
  295.             del code.nodes[0]
  296.         
  297.         return Class(name, bases, doc, code, lineno = nodelist[1][2])
  298.  
  299.     
  300.     def stmt(self, nodelist):
  301.         return self.com_stmt(nodelist[0])
  302.  
  303.     small_stmt = stmt
  304.     flow_stmt = stmt
  305.     compound_stmt = stmt
  306.     
  307.     def simple_stmt(self, nodelist):
  308.         stmts = []
  309.         for i in range(0, len(nodelist), 2):
  310.             self.com_append_stmt(stmts, nodelist[i])
  311.         
  312.         return Stmt(stmts)
  313.  
  314.     
  315.     def parameters(self, nodelist):
  316.         raise WalkerError
  317.  
  318.     
  319.     def varargslist(self, nodelist):
  320.         raise WalkerError
  321.  
  322.     
  323.     def fpdef(self, nodelist):
  324.         raise WalkerError
  325.  
  326.     
  327.     def fplist(self, nodelist):
  328.         raise WalkerError
  329.  
  330.     
  331.     def dotted_name(self, nodelist):
  332.         raise WalkerError
  333.  
  334.     
  335.     def comp_op(self, nodelist):
  336.         raise WalkerError
  337.  
  338.     
  339.     def trailer(self, nodelist):
  340.         raise WalkerError
  341.  
  342.     
  343.     def sliceop(self, nodelist):
  344.         raise WalkerError
  345.  
  346.     
  347.     def argument(self, nodelist):
  348.         raise WalkerError
  349.  
  350.     
  351.     def expr_stmt(self, nodelist):
  352.         en = nodelist[-1]
  353.         exprNode = self.lookup_node(en)(en[1:])
  354.         if len(nodelist) == 1:
  355.             return Discard(exprNode, lineno = exprNode.lineno)
  356.         
  357.         if nodelist[1][0] == token.EQUAL:
  358.             nodesl = []
  359.             for i in range(0, len(nodelist) - 2, 2):
  360.                 nodesl.append(self.com_assign(nodelist[i], OP_ASSIGN))
  361.             
  362.             return Assign(nodesl, exprNode, lineno = nodelist[1][2])
  363.         else:
  364.             lval = self.com_augassign(nodelist[0])
  365.             op = self.com_augassign_op(nodelist[1])
  366.             return AugAssign(lval, op[1], exprNode, lineno = op[2])
  367.         raise WalkerError, "can't get here"
  368.  
  369.     
  370.     def print_stmt(self, nodelist):
  371.         items = []
  372.         if len(nodelist) == 1:
  373.             start = 1
  374.             dest = None
  375.         elif nodelist[1][0] == token.RIGHTSHIFT:
  376.             if not len(nodelist) == 3 and nodelist[3][0] == token.COMMA:
  377.                 raise AssertionError
  378.             dest = self.com_node(nodelist[2])
  379.             start = 4
  380.         else:
  381.             dest = None
  382.             start = 1
  383.         for i in range(start, len(nodelist), 2):
  384.             items.append(self.com_node(nodelist[i]))
  385.         
  386.         if nodelist[-1][0] == token.COMMA:
  387.             return Print(items, dest, lineno = nodelist[0][2])
  388.         
  389.         return Printnl(items, dest, lineno = nodelist[0][2])
  390.  
  391.     
  392.     def del_stmt(self, nodelist):
  393.         return self.com_assign(nodelist[1], OP_DELETE)
  394.  
  395.     
  396.     def pass_stmt(self, nodelist):
  397.         return Pass(lineno = nodelist[0][2])
  398.  
  399.     
  400.     def break_stmt(self, nodelist):
  401.         return Break(lineno = nodelist[0][2])
  402.  
  403.     
  404.     def continue_stmt(self, nodelist):
  405.         return Continue(lineno = nodelist[0][2])
  406.  
  407.     
  408.     def return_stmt(self, nodelist):
  409.         if len(nodelist) < 2:
  410.             return Return(Const(None), lineno = nodelist[0][2])
  411.         
  412.         return Return(self.com_node(nodelist[1]), lineno = nodelist[0][2])
  413.  
  414.     
  415.     def yield_stmt(self, nodelist):
  416.         return Yield(self.com_node(nodelist[1]), lineno = nodelist[0][2])
  417.  
  418.     
  419.     def raise_stmt(self, nodelist):
  420.         if len(nodelist) > 5:
  421.             expr3 = self.com_node(nodelist[5])
  422.         else:
  423.             expr3 = None
  424.         if len(nodelist) > 3:
  425.             expr2 = self.com_node(nodelist[3])
  426.         else:
  427.             expr2 = None
  428.         if len(nodelist) > 1:
  429.             expr1 = self.com_node(nodelist[1])
  430.         else:
  431.             expr1 = None
  432.         return Raise(expr1, expr2, expr3, lineno = nodelist[0][2])
  433.  
  434.     
  435.     def import_stmt(self, nodelist):
  436.         if not len(nodelist) == 1:
  437.             raise AssertionError
  438.         return self.com_node(nodelist[0])
  439.  
  440.     
  441.     def import_name(self, nodelist):
  442.         return Import(self.com_dotted_as_names(nodelist[1]), lineno = nodelist[0][2])
  443.  
  444.     
  445.     def import_from(self, nodelist):
  446.         if not nodelist[0][1] == 'from':
  447.             raise AssertionError
  448.         if not nodelist[1][0] == symbol.dotted_name:
  449.             raise AssertionError
  450.         if not nodelist[2][1] == 'import':
  451.             raise AssertionError
  452.         fromname = self.com_dotted_name(nodelist[1])
  453.         if nodelist[3][0] == token.STAR:
  454.             return From(fromname, [
  455.                 ('*', None)], lineno = nodelist[0][2])
  456.         else:
  457.             node = nodelist[3 + (nodelist[3][0] == token.LPAR)]
  458.             return From(fromname, self.com_import_as_names(node), lineno = nodelist[0][2])
  459.  
  460.     
  461.     def global_stmt(self, nodelist):
  462.         names = []
  463.         for i in range(1, len(nodelist), 2):
  464.             names.append(nodelist[i][1])
  465.         
  466.         return Global(names, lineno = nodelist[0][2])
  467.  
  468.     
  469.     def exec_stmt(self, nodelist):
  470.         expr1 = self.com_node(nodelist[1])
  471.         if len(nodelist) >= 4:
  472.             expr2 = self.com_node(nodelist[3])
  473.             if len(nodelist) >= 6:
  474.                 expr3 = self.com_node(nodelist[5])
  475.             else:
  476.                 expr3 = None
  477.         else:
  478.             expr2 = None
  479.             expr3 = None
  480.         return Exec(expr1, expr2, expr3, lineno = nodelist[0][2])
  481.  
  482.     
  483.     def assert_stmt(self, nodelist):
  484.         expr1 = self.com_node(nodelist[1])
  485.         if len(nodelist) == 4:
  486.             expr2 = self.com_node(nodelist[3])
  487.         else:
  488.             expr2 = None
  489.         return Assert(expr1, expr2, lineno = nodelist[0][2])
  490.  
  491.     
  492.     def if_stmt(self, nodelist):
  493.         tests = []
  494.         for i in range(0, len(nodelist) - 3, 4):
  495.             testNode = self.com_node(nodelist[i + 1])
  496.             suiteNode = self.com_node(nodelist[i + 3])
  497.             tests.append((testNode, suiteNode))
  498.         
  499.         if len(nodelist) % 4 == 3:
  500.             elseNode = self.com_node(nodelist[-1])
  501.         else:
  502.             elseNode = None
  503.         return If(tests, elseNode, lineno = nodelist[0][2])
  504.  
  505.     
  506.     def while_stmt(self, nodelist):
  507.         testNode = self.com_node(nodelist[1])
  508.         bodyNode = self.com_node(nodelist[3])
  509.         if len(nodelist) > 4:
  510.             elseNode = self.com_node(nodelist[6])
  511.         else:
  512.             elseNode = None
  513.         return While(testNode, bodyNode, elseNode, lineno = nodelist[0][2])
  514.  
  515.     
  516.     def for_stmt(self, nodelist):
  517.         assignNode = self.com_assign(nodelist[1], OP_ASSIGN)
  518.         listNode = self.com_node(nodelist[3])
  519.         bodyNode = self.com_node(nodelist[5])
  520.         if len(nodelist) > 8:
  521.             elseNode = self.com_node(nodelist[8])
  522.         else:
  523.             elseNode = None
  524.         return For(assignNode, listNode, bodyNode, elseNode, lineno = nodelist[0][2])
  525.  
  526.     
  527.     def try_stmt(self, nodelist):
  528.         if nodelist[3][0] != symbol.except_clause:
  529.             return self.com_try_finally(nodelist)
  530.         
  531.         return self.com_try_except(nodelist)
  532.  
  533.     
  534.     def suite(self, nodelist):
  535.         if len(nodelist) == 1:
  536.             return self.com_stmt(nodelist[0])
  537.         
  538.         stmts = []
  539.         for node in nodelist:
  540.             if node[0] == symbol.stmt:
  541.                 self.com_append_stmt(stmts, node)
  542.                 continue
  543.         
  544.         return Stmt(stmts)
  545.  
  546.     
  547.     def testlist(self, nodelist):
  548.         return self.com_binary(Tuple, nodelist)
  549.  
  550.     testlist_safe = testlist
  551.     testlist1 = testlist
  552.     exprlist = testlist
  553.     
  554.     def testlist_gexp(self, nodelist):
  555.         if len(nodelist) == 2 and nodelist[1][0] == symbol.gen_for:
  556.             test = self.com_node(nodelist[0])
  557.             return self.com_generator_expression(test, nodelist[1])
  558.         
  559.         return self.testlist(nodelist)
  560.  
  561.     
  562.     def test(self, nodelist):
  563.         if len(nodelist) == 1 and nodelist[0][0] == symbol.lambdef:
  564.             return self.lambdef(nodelist[0])
  565.         
  566.         return self.com_binary(Or, nodelist)
  567.  
  568.     
  569.     def and_test(self, nodelist):
  570.         return self.com_binary(And, nodelist)
  571.  
  572.     
  573.     def not_test(self, nodelist):
  574.         result = self.com_node(nodelist[-1])
  575.         if len(nodelist) == 2:
  576.             return Not(result, lineno = nodelist[0][2])
  577.         
  578.         return result
  579.  
  580.     
  581.     def comparison(self, nodelist):
  582.         node = self.com_node(nodelist[0])
  583.         if len(nodelist) == 1:
  584.             return node
  585.         
  586.         results = []
  587.         for i in range(2, len(nodelist), 2):
  588.             nl = nodelist[i - 1]
  589.             n = nl[1]
  590.             if n[0] == token.NAME:
  591.                 type = n[1]
  592.                 if len(nl) == 3:
  593.                     if type == 'not':
  594.                         type = 'not in'
  595.                     else:
  596.                         type = 'is not'
  597.                 
  598.             else:
  599.                 type = _cmp_types[n[0]]
  600.             lineno = nl[1][2]
  601.             results.append((type, self.com_node(nodelist[i])))
  602.         
  603.         return Compare(node, results, lineno = lineno)
  604.  
  605.     
  606.     def expr(self, nodelist):
  607.         return self.com_binary(Bitor, nodelist)
  608.  
  609.     
  610.     def xor_expr(self, nodelist):
  611.         return self.com_binary(Bitxor, nodelist)
  612.  
  613.     
  614.     def and_expr(self, nodelist):
  615.         return self.com_binary(Bitand, nodelist)
  616.  
  617.     
  618.     def shift_expr(self, nodelist):
  619.         node = self.com_node(nodelist[0])
  620.         for i in range(2, len(nodelist), 2):
  621.             right = self.com_node(nodelist[i])
  622.             if nodelist[i - 1][0] == token.LEFTSHIFT:
  623.                 node = LeftShift([
  624.                     node,
  625.                     right], lineno = nodelist[1][2])
  626.                 continue
  627.             if nodelist[i - 1][0] == token.RIGHTSHIFT:
  628.                 node = RightShift([
  629.                     node,
  630.                     right], lineno = nodelist[1][2])
  631.                 continue
  632.             raise ValueError, 'unexpected token: %s' % nodelist[i - 1][0]
  633.         
  634.         return node
  635.  
  636.     
  637.     def arith_expr(self, nodelist):
  638.         node = self.com_node(nodelist[0])
  639.         for i in range(2, len(nodelist), 2):
  640.             right = self.com_node(nodelist[i])
  641.             if nodelist[i - 1][0] == token.PLUS:
  642.                 node = Add([
  643.                     node,
  644.                     right], lineno = nodelist[1][2])
  645.                 continue
  646.             if nodelist[i - 1][0] == token.MINUS:
  647.                 node = Sub([
  648.                     node,
  649.                     right], lineno = nodelist[1][2])
  650.                 continue
  651.             raise ValueError, 'unexpected token: %s' % nodelist[i - 1][0]
  652.         
  653.         return node
  654.  
  655.     
  656.     def term(self, nodelist):
  657.         node = self.com_node(nodelist[0])
  658.         for i in range(2, len(nodelist), 2):
  659.             right = self.com_node(nodelist[i])
  660.             t = nodelist[i - 1][0]
  661.             if t == token.STAR:
  662.                 node = Mul([
  663.                     node,
  664.                     right])
  665.             elif t == token.SLASH:
  666.                 node = Div([
  667.                     node,
  668.                     right])
  669.             elif t == token.PERCENT:
  670.                 node = Mod([
  671.                     node,
  672.                     right])
  673.             elif t == token.DOUBLESLASH:
  674.                 node = FloorDiv([
  675.                     node,
  676.                     right])
  677.             else:
  678.                 raise ValueError, 'unexpected token: %s' % t
  679.             node.lineno = nodelist[1][2]
  680.         
  681.         return node
  682.  
  683.     
  684.     def factor(self, nodelist):
  685.         elt = nodelist[0]
  686.         t = elt[0]
  687.         node = self.lookup_node(nodelist[-1])(nodelist[-1][1:])
  688.         if t == token.PLUS:
  689.             return UnaryAdd(node, lineno = elt[2])
  690.         elif t == token.MINUS:
  691.             return UnarySub(node, lineno = elt[2])
  692.         elif t == token.TILDE:
  693.             node = Invert(node, lineno = elt[2])
  694.         
  695.         return node
  696.  
  697.     
  698.     def power(self, nodelist):
  699.         node = self.com_node(nodelist[0])
  700.         for i in range(1, len(nodelist)):
  701.             elt = nodelist[i]
  702.             if elt[0] == token.DOUBLESTAR:
  703.                 return Power([
  704.                     node,
  705.                     self.com_node(nodelist[i + 1])], lineno = elt[2])
  706.             
  707.             node = self.com_apply_trailer(node, elt)
  708.         
  709.         return node
  710.  
  711.     
  712.     def atom(self, nodelist):
  713.         return self._atom_dispatch[nodelist[0][0]](nodelist)
  714.         n.lineno = nodelist[0][2]
  715.         return n
  716.  
  717.     
  718.     def atom_lpar(self, nodelist):
  719.         if nodelist[1][0] == token.RPAR:
  720.             return Tuple(())
  721.         
  722.         return self.com_node(nodelist[1])
  723.  
  724.     
  725.     def atom_lsqb(self, nodelist):
  726.         if nodelist[1][0] == token.RSQB:
  727.             return List(())
  728.         
  729.         return self.com_list_constructor(nodelist[1])
  730.  
  731.     
  732.     def atom_lbrace(self, nodelist):
  733.         if nodelist[1][0] == token.RBRACE:
  734.             return Dict(())
  735.         
  736.         return self.com_dictmaker(nodelist[1])
  737.  
  738.     
  739.     def atom_backquote(self, nodelist):
  740.         return Backquote(self.com_node(nodelist[1]))
  741.  
  742.     
  743.     def atom_number(self, nodelist):
  744.         k = eval(nodelist[0][1])
  745.         return Const(k, lineno = nodelist[0][2])
  746.  
  747.     
  748.     def decode_literal(self, lit):
  749.         if self.encoding:
  750.             if self.encoding not in [
  751.                 'utf-8',
  752.                 'iso-8859-1']:
  753.                 lit = unicode(lit, 'utf-8').encode(self.encoding)
  754.             
  755.             return eval('# coding: %s\n%s' % (self.encoding, lit))
  756.         else:
  757.             return eval(lit)
  758.  
  759.     
  760.     def atom_string(self, nodelist):
  761.         k = ''
  762.         for node in nodelist:
  763.             k += self.decode_literal(node[1])
  764.         
  765.         return Const(k, lineno = nodelist[0][2])
  766.  
  767.     
  768.     def atom_name(self, nodelist):
  769.         return Name(nodelist[0][1], lineno = nodelist[0][2])
  770.  
  771.     
  772.     def lookup_node(self, node):
  773.         return self._dispatch[node[0]]
  774.  
  775.     _callers = { }
  776.     
  777.     def com_node(self, node):
  778.         return self._dispatch[node[0]](node[1:])
  779.  
  780.     
  781.     def com_NEWLINE(self, *args):
  782.         return Discard(Const(None))
  783.  
  784.     
  785.     def com_arglist(self, nodelist):
  786.         names = []
  787.         defaults = []
  788.         flags = 0
  789.         i = 0
  790.         while i < len(nodelist):
  791.             node = nodelist[i]
  792.             if node[0] == token.STAR or node[0] == token.DOUBLESTAR:
  793.                 if node[0] == token.STAR:
  794.                     node = nodelist[i + 1]
  795.                     if node[0] == token.NAME:
  796.                         names.append(node[1])
  797.                         flags = flags | CO_VARARGS
  798.                         i = i + 3
  799.                     
  800.                 
  801.                 if i < len(nodelist):
  802.                     t = nodelist[i][0]
  803.                     if t == token.DOUBLESTAR:
  804.                         node = nodelist[i + 1]
  805.                     else:
  806.                         raise ValueError, 'unexpected token: %s' % t
  807.                     names.append(node[1])
  808.                     flags = flags | CO_VARKEYWORDS
  809.                 
  810.                 break
  811.             
  812.             names.append(self.com_fpdef(node))
  813.             i = i + 1
  814.             if i >= len(nodelist):
  815.                 break
  816.             
  817.             if nodelist[i][0] == token.EQUAL:
  818.                 defaults.append(self.com_node(nodelist[i + 1]))
  819.                 i = i + 2
  820.             elif len(defaults):
  821.                 defaults.append(Const(None))
  822.             
  823.             i = i + 1
  824.         return (names, defaults, flags)
  825.  
  826.     
  827.     def com_fpdef(self, node):
  828.         if node[1][0] == token.LPAR:
  829.             return self.com_fplist(node[2])
  830.         
  831.         return node[1][1]
  832.  
  833.     
  834.     def com_fplist(self, node):
  835.         if len(node) == 2:
  836.             return self.com_fpdef(node[1])
  837.         
  838.         list = []
  839.         for i in range(1, len(node), 2):
  840.             list.append(self.com_fpdef(node[i]))
  841.         
  842.         return tuple(list)
  843.  
  844.     
  845.     def com_dotted_name(self, node):
  846.         name = ''
  847.         for n in node:
  848.             if type(n) == type(()) and n[0] == 1:
  849.                 name = name + n[1] + '.'
  850.                 continue
  851.         
  852.         return name[:-1]
  853.  
  854.     
  855.     def com_dotted_as_name(self, node):
  856.         if not node[0] == symbol.dotted_as_name:
  857.             raise AssertionError
  858.         node = node[1:]
  859.         dot = self.com_dotted_name(node[0][1:])
  860.         if len(node) == 1:
  861.             return (dot, None)
  862.         
  863.         if not node[1][1] == 'as':
  864.             raise AssertionError
  865.         if not node[2][0] == token.NAME:
  866.             raise AssertionError
  867.         return (dot, node[2][1])
  868.  
  869.     
  870.     def com_dotted_as_names(self, node):
  871.         if not node[0] == symbol.dotted_as_names:
  872.             raise AssertionError
  873.         node = node[1:]
  874.         names = [
  875.             self.com_dotted_as_name(node[0])]
  876.         for i in range(2, len(node), 2):
  877.             names.append(self.com_dotted_as_name(node[i]))
  878.         
  879.         return names
  880.  
  881.     
  882.     def com_import_as_name(self, node):
  883.         if not node[0] == symbol.import_as_name:
  884.             raise AssertionError
  885.         node = node[1:]
  886.         if not node[0][0] == token.NAME:
  887.             raise AssertionError
  888.         if len(node) == 1:
  889.             return (node[0][1], None)
  890.         
  891.         if not node[1][1] == 'as':
  892.             raise AssertionError, node
  893.         if not node[2][0] == token.NAME:
  894.             raise AssertionError
  895.         return (node[0][1], node[2][1])
  896.  
  897.     
  898.     def com_import_as_names(self, node):
  899.         if not node[0] == symbol.import_as_names:
  900.             raise AssertionError
  901.         node = node[1:]
  902.         names = [
  903.             self.com_import_as_name(node[0])]
  904.         for i in range(2, len(node), 2):
  905.             names.append(self.com_import_as_name(node[i]))
  906.         
  907.         return names
  908.  
  909.     
  910.     def com_bases(self, node):
  911.         bases = []
  912.         for i in range(1, len(node), 2):
  913.             bases.append(self.com_node(node[i]))
  914.         
  915.         return bases
  916.  
  917.     
  918.     def com_try_finally(self, nodelist):
  919.         return TryFinally(self.com_node(nodelist[2]), self.com_node(nodelist[5]), lineno = nodelist[0][2])
  920.  
  921.     
  922.     def com_try_except(self, nodelist):
  923.         stmt = self.com_node(nodelist[2])
  924.         clauses = []
  925.         elseNode = None
  926.         for i in range(3, len(nodelist), 3):
  927.             node = nodelist[i]
  928.             if node[0] == symbol.except_clause:
  929.                 if len(node) > 2:
  930.                     expr1 = self.com_node(node[2])
  931.                     if len(node) > 4:
  932.                         expr2 = self.com_assign(node[4], OP_ASSIGN)
  933.                     else:
  934.                         expr2 = None
  935.                 else:
  936.                     expr1 = None
  937.                     expr2 = None
  938.                 clauses.append((expr1, expr2, self.com_node(nodelist[i + 2])))
  939.             
  940.             if node[0] == token.NAME:
  941.                 elseNode = self.com_node(nodelist[i + 2])
  942.                 continue
  943.         
  944.         return TryExcept(self.com_node(nodelist[2]), clauses, elseNode, lineno = nodelist[0][2])
  945.  
  946.     
  947.     def com_augassign_op(self, node):
  948.         if not node[0] == symbol.augassign:
  949.             raise AssertionError
  950.         return node[1]
  951.  
  952.     
  953.     def com_augassign(self, node):
  954.         '''Return node suitable for lvalue of augmented assignment
  955.  
  956.         Names, slices, and attributes are the only allowable nodes.
  957.         '''
  958.         l = self.com_node(node)
  959.         if l.__class__ in (Name, Slice, Subscript, Getattr):
  960.             return l
  961.         
  962.         raise SyntaxError, "can't assign to %s" % l.__class__.__name__
  963.  
  964.     
  965.     def com_assign(self, node, assigning):
  966.         while None:
  967.             t = node[0]
  968.             if t == symbol.exprlist and t == symbol.testlist or t == symbol.testlist_gexp:
  969.                 if len(node) > 2:
  970.                     return self.com_assign_tuple(node, assigning)
  971.                 
  972.                 node = node[1]
  973.                 continue
  974.             if t in _assign_types:
  975.                 if len(node) > 2:
  976.                     raise SyntaxError, "can't assign to operator"
  977.                 
  978.                 node = node[1]
  979.                 continue
  980.             None if t == symbol.power else t == token.LPAR
  981.             raise SyntaxError, 'bad assignment'
  982.  
  983.     
  984.     def com_assign_tuple(self, node, assigning):
  985.         assigns = []
  986.         for i in range(1, len(node), 2):
  987.             assigns.append(self.com_assign(node[i], assigning))
  988.         
  989.         return AssTuple(assigns, lineno = extractLineNo(node))
  990.  
  991.     
  992.     def com_assign_list(self, node, assigning):
  993.         assigns = []
  994.         for i in range(1, len(node), 2):
  995.             if i + 1 < len(node):
  996.                 if node[i + 1][0] == symbol.list_for:
  997.                     raise SyntaxError, "can't assign to list comprehension"
  998.                 
  999.                 if not node[i + 1][0] == token.COMMA:
  1000.                     raise AssertionError, node[i + 1]
  1001.             
  1002.             assigns.append(self.com_assign(node[i], assigning))
  1003.         
  1004.         return AssList(assigns, lineno = extractLineNo(node))
  1005.  
  1006.     
  1007.     def com_assign_name(self, node, assigning):
  1008.         return AssName(node[1], assigning, lineno = node[2])
  1009.  
  1010.     
  1011.     def com_assign_trailer(self, primary, node, assigning):
  1012.         t = node[1][0]
  1013.         if t == token.DOT:
  1014.             return self.com_assign_attr(primary, node[2], assigning)
  1015.         
  1016.         if t == token.LSQB:
  1017.             return self.com_subscriptlist(primary, node[2], assigning)
  1018.         
  1019.         if t == token.LPAR:
  1020.             raise SyntaxError, "can't assign to function call"
  1021.         
  1022.         raise SyntaxError, 'unknown trailer type: %s' % t
  1023.  
  1024.     
  1025.     def com_assign_attr(self, primary, node, assigning):
  1026.         return AssAttr(primary, node[1], assigning, lineno = node[-1])
  1027.  
  1028.     
  1029.     def com_binary(self, constructor, nodelist):
  1030.         """Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])."""
  1031.         l = len(nodelist)
  1032.         if l == 1:
  1033.             n = nodelist[0]
  1034.             return self.lookup_node(n)(n[1:])
  1035.         
  1036.         items = []
  1037.         for i in range(0, l, 2):
  1038.             n = nodelist[i]
  1039.             items.append(self.lookup_node(n)(n[1:]))
  1040.         
  1041.         return constructor(items, lineno = extractLineNo(nodelist))
  1042.  
  1043.     
  1044.     def com_stmt(self, node):
  1045.         result = self.lookup_node(node)(node[1:])
  1046.         if not result is not None:
  1047.             raise AssertionError
  1048.         if isinstance(result, Stmt):
  1049.             return result
  1050.         
  1051.         return Stmt([
  1052.             result])
  1053.  
  1054.     
  1055.     def com_append_stmt(self, stmts, node):
  1056.         result = self.lookup_node(node)(node[1:])
  1057.         if not result is not None:
  1058.             raise AssertionError
  1059.         if isinstance(result, Stmt):
  1060.             stmts.extend(result.nodes)
  1061.         else:
  1062.             stmts.append(result)
  1063.  
  1064.     if hasattr(symbol, 'list_for'):
  1065.         
  1066.         def com_list_constructor(self, nodelist):
  1067.             values = []
  1068.             for i in range(1, len(nodelist)):
  1069.                 if nodelist[i][0] == symbol.list_for:
  1070.                     if not len(nodelist[i:]) == 1:
  1071.                         raise AssertionError
  1072.                     return self.com_list_comprehension(values[0], nodelist[i])
  1073.                 elif nodelist[i][0] == token.COMMA:
  1074.                     continue
  1075.                 
  1076.                 values.append(self.com_node(nodelist[i]))
  1077.             
  1078.             return List(values, lineno = values[0].lineno)
  1079.  
  1080.         
  1081.         def com_list_comprehension(self, expr, node):
  1082.             lineno = node[1][2]
  1083.             fors = []
  1084.             while node:
  1085.                 t = node[1][1]
  1086.                 if t == 'for':
  1087.                     assignNode = self.com_assign(node[2], OP_ASSIGN)
  1088.                     listNode = self.com_node(node[4])
  1089.                     newfor = ListCompFor(assignNode, listNode, [])
  1090.                     newfor.lineno = node[1][2]
  1091.                     fors.append(newfor)
  1092.                     if len(node) == 5:
  1093.                         node = None
  1094.                     else:
  1095.                         node = self.com_list_iter(node[5])
  1096.                 len(node) == 5
  1097.                 if t == 'if':
  1098.                     test = self.com_node(node[2])
  1099.                     newif = ListCompIf(test, lineno = node[1][2])
  1100.                     newfor.ifs.append(newif)
  1101.                     if len(node) == 3:
  1102.                         node = None
  1103.                     else:
  1104.                         node = self.com_list_iter(node[3])
  1105.                 len(node) == 3
  1106.                 raise SyntaxError, 'unexpected list comprehension element: %s %d' % (node, lineno)
  1107.             return ListComp(expr, fors, lineno = lineno)
  1108.  
  1109.         
  1110.         def com_list_iter(self, node):
  1111.             if not node[0] == symbol.list_iter:
  1112.                 raise AssertionError
  1113.             return node[1]
  1114.  
  1115.     else:
  1116.         
  1117.         def com_list_constructor(self, nodelist):
  1118.             values = []
  1119.             for i in range(1, len(nodelist), 2):
  1120.                 values.append(self.com_node(nodelist[i]))
  1121.             
  1122.             return List(values)
  1123.  
  1124.     if hasattr(symbol, 'gen_for'):
  1125.         
  1126.         def com_generator_expression(self, expr, node):
  1127.             lineno = node[1][2]
  1128.             fors = []
  1129.             while node:
  1130.                 t = node[1][1]
  1131.                 if t == 'for':
  1132.                     assignNode = self.com_assign(node[2], OP_ASSIGN)
  1133.                     genNode = self.com_node(node[4])
  1134.                     newfor = GenExprFor(assignNode, genNode, [], lineno = node[1][2])
  1135.                     fors.append(newfor)
  1136.                     if len(node) == 5:
  1137.                         node = None
  1138.                     else:
  1139.                         node = self.com_gen_iter(node[5])
  1140.                 len(node) == 5
  1141.                 if t == 'if':
  1142.                     test = self.com_node(node[2])
  1143.                     newif = GenExprIf(test, lineno = node[1][2])
  1144.                     newfor.ifs.append(newif)
  1145.                     if len(node) == 3:
  1146.                         node = None
  1147.                     else:
  1148.                         node = self.com_gen_iter(node[3])
  1149.                 len(node) == 3
  1150.                 raise SyntaxError, 'unexpected generator expression element: %s %d' % (node, lineno)
  1151.             fors[0].is_outmost = True
  1152.             return GenExpr(GenExprInner(expr, fors), lineno = lineno)
  1153.  
  1154.         
  1155.         def com_gen_iter(self, node):
  1156.             if not node[0] == symbol.gen_iter:
  1157.                 raise AssertionError
  1158.             return node[1]
  1159.  
  1160.     
  1161.     
  1162.     def com_dictmaker(self, nodelist):
  1163.         items = []
  1164.         for i in range(1, len(nodelist), 4):
  1165.             items.append((self.com_node(nodelist[i]), self.com_node(nodelist[i + 2])))
  1166.         
  1167.         return Dict(items)
  1168.  
  1169.     
  1170.     def com_apply_trailer(self, primaryNode, nodelist):
  1171.         t = nodelist[1][0]
  1172.         if t == token.LPAR:
  1173.             return self.com_call_function(primaryNode, nodelist[2])
  1174.         
  1175.         if t == token.DOT:
  1176.             return self.com_select_member(primaryNode, nodelist[2])
  1177.         
  1178.         if t == token.LSQB:
  1179.             return self.com_subscriptlist(primaryNode, nodelist[2], OP_APPLY)
  1180.         
  1181.         raise SyntaxError, 'unknown node type: %s' % t
  1182.  
  1183.     
  1184.     def com_select_member(self, primaryNode, nodelist):
  1185.         if nodelist[0] != token.NAME:
  1186.             raise SyntaxError, 'member must be a name'
  1187.         
  1188.         return Getattr(primaryNode, nodelist[1], lineno = nodelist[2])
  1189.  
  1190.     
  1191.     def com_call_function(self, primaryNode, nodelist):
  1192.         if nodelist[0] == token.RPAR:
  1193.             return CallFunc(primaryNode, [], lineno = extractLineNo(nodelist))
  1194.         
  1195.         args = []
  1196.         kw = 0
  1197.         len_nodelist = len(nodelist)
  1198.         for i in range(1, len_nodelist, 2):
  1199.             node = nodelist[i]
  1200.             if node[0] == token.STAR or node[0] == token.DOUBLESTAR:
  1201.                 break
  1202.             
  1203.             (kw, result) = self.com_argument(node, kw)
  1204.             if len_nodelist != 2 and isinstance(result, GenExpr) and len(node) == 3 and node[2][0] == symbol.gen_for:
  1205.                 raise SyntaxError, 'generator expression needs parenthesis'
  1206.             
  1207.             args.append(result)
  1208.         else:
  1209.             i = i + 1
  1210.         if i < len_nodelist and nodelist[i][0] == token.COMMA:
  1211.             i = i + 1
  1212.         
  1213.         star_node = None
  1214.         dstar_node = None
  1215.         while i < len_nodelist:
  1216.             tok = nodelist[i]
  1217.             ch = nodelist[i + 1]
  1218.             i = i + 3
  1219.             if tok[0] == token.STAR:
  1220.                 if star_node is not None:
  1221.                     raise SyntaxError, 'already have the varargs indentifier'
  1222.                 
  1223.                 star_node = self.com_node(ch)
  1224.                 continue
  1225.             if tok[0] == token.DOUBLESTAR:
  1226.                 if dstar_node is not None:
  1227.                     raise SyntaxError, 'already have the kwargs indentifier'
  1228.                 
  1229.                 dstar_node = self.com_node(ch)
  1230.                 continue
  1231.             raise SyntaxError, 'unknown node type: %s' % tok
  1232.         return CallFunc(primaryNode, args, star_node, dstar_node, lineno = extractLineNo(nodelist))
  1233.  
  1234.     
  1235.     def com_argument(self, nodelist, kw):
  1236.         if len(nodelist) == 3 and nodelist[2][0] == symbol.gen_for:
  1237.             test = self.com_node(nodelist[1])
  1238.             return (0, self.com_generator_expression(test, nodelist[2]))
  1239.         
  1240.         if len(nodelist) == 2:
  1241.             if kw:
  1242.                 raise SyntaxError, 'non-keyword arg after keyword arg'
  1243.             
  1244.             return (0, self.com_node(nodelist[1]))
  1245.         
  1246.         result = self.com_node(nodelist[3])
  1247.         n = nodelist[1]
  1248.         while len(n) == 2 and n[0] != token.NAME:
  1249.             n = n[1]
  1250.         if n[0] != token.NAME:
  1251.             raise SyntaxError, "keyword can't be an expression (%s)" % n[0]
  1252.         
  1253.         node = Keyword(n[1], result, lineno = n[2])
  1254.         return (1, node)
  1255.  
  1256.     
  1257.     def com_subscriptlist(self, primary, nodelist, assigning):
  1258.         if len(nodelist) == 2:
  1259.             sub = nodelist[1]
  1260.             if (sub[1][0] == token.COLON or len(sub) > 2 or sub[2][0] == token.COLON) and sub[-1][0] != symbol.sliceop:
  1261.                 return self.com_slice(primary, sub, assigning)
  1262.             
  1263.         
  1264.         subscripts = []
  1265.         for i in range(1, len(nodelist), 2):
  1266.             subscripts.append(self.com_subscript(nodelist[i]))
  1267.         
  1268.         return Subscript(primary, assigning, subscripts, lineno = extractLineNo(nodelist))
  1269.  
  1270.     
  1271.     def com_subscript(self, node):
  1272.         ch = node[1]
  1273.         t = ch[0]
  1274.         if t == token.DOT and node[2][0] == token.DOT:
  1275.             return Ellipsis()
  1276.         
  1277.         if t == token.COLON or len(node) > 2:
  1278.             return self.com_sliceobj(node)
  1279.         
  1280.         return self.com_node(ch)
  1281.  
  1282.     
  1283.     def com_sliceobj(self, node):
  1284.         items = []
  1285.         if node[1][0] == token.COLON:
  1286.             items.append(Const(None))
  1287.             i = 2
  1288.         else:
  1289.             items.append(self.com_node(node[1]))
  1290.             i = 3
  1291.         if i < len(node) and node[i][0] == symbol.test:
  1292.             items.append(self.com_node(node[i]))
  1293.             i = i + 1
  1294.         else:
  1295.             items.append(Const(None))
  1296.         for j in range(i, len(node)):
  1297.             ch = node[j]
  1298.             if len(ch) == 2:
  1299.                 items.append(Const(None))
  1300.                 continue
  1301.             items.append(self.com_node(ch[2]))
  1302.         
  1303.         return Sliceobj(items, lineno = extractLineNo(node))
  1304.  
  1305.     
  1306.     def com_slice(self, primary, node, assigning):
  1307.         lower = None
  1308.         upper = None
  1309.         if len(node) == 3:
  1310.             if node[1][0] == token.COLON:
  1311.                 upper = self.com_node(node[2])
  1312.             else:
  1313.                 lower = self.com_node(node[1])
  1314.         elif len(node) == 4:
  1315.             lower = self.com_node(node[1])
  1316.             upper = self.com_node(node[3])
  1317.         
  1318.         return Slice(primary, assigning, lower, upper, lineno = extractLineNo(node))
  1319.  
  1320.     
  1321.     def get_docstring(self, node, n = None):
  1322.         if n is None:
  1323.             n = node[0]
  1324.             node = node[1:]
  1325.         
  1326.         if n == symbol.suite:
  1327.             if len(node) == 1:
  1328.                 return self.get_docstring(node[0])
  1329.             
  1330.             for sub in node:
  1331.                 if sub[0] == symbol.stmt:
  1332.                     return self.get_docstring(sub)
  1333.                     continue
  1334.             
  1335.             return None
  1336.         
  1337.         if n == symbol.file_input:
  1338.             for sub in node:
  1339.                 if sub[0] == symbol.stmt:
  1340.                     return self.get_docstring(sub)
  1341.                     continue
  1342.             
  1343.             return None
  1344.         
  1345.         if n == symbol.atom:
  1346.             if node[0][0] == token.STRING:
  1347.                 s = ''
  1348.                 for t in node:
  1349.                     s = s + eval(t[1])
  1350.                 
  1351.                 return s
  1352.             
  1353.             return None
  1354.         
  1355.         if n == symbol.stmt and n == symbol.simple_stmt or n == symbol.small_stmt:
  1356.             return self.get_docstring(node[0])
  1357.         
  1358.         if n in _doc_nodes and len(node) == 1:
  1359.             return self.get_docstring(node[0])
  1360.         
  1361.  
  1362.  
  1363. _doc_nodes = [
  1364.     symbol.expr_stmt,
  1365.     symbol.testlist,
  1366.     symbol.testlist_safe,
  1367.     symbol.test,
  1368.     symbol.and_test,
  1369.     symbol.not_test,
  1370.     symbol.comparison,
  1371.     symbol.expr,
  1372.     symbol.xor_expr,
  1373.     symbol.and_expr,
  1374.     symbol.shift_expr,
  1375.     symbol.arith_expr,
  1376.     symbol.term,
  1377.     symbol.factor,
  1378.     symbol.power]
  1379. _cmp_types = {
  1380.     token.LESS: '<',
  1381.     token.GREATER: '>',
  1382.     token.EQEQUAL: '==',
  1383.     token.EQUAL: '==',
  1384.     token.LESSEQUAL: '<=',
  1385.     token.GREATEREQUAL: '>=',
  1386.     token.NOTEQUAL: '!=' }
  1387. _legal_node_types = [
  1388.     symbol.funcdef,
  1389.     symbol.classdef,
  1390.     symbol.stmt,
  1391.     symbol.small_stmt,
  1392.     symbol.flow_stmt,
  1393.     symbol.simple_stmt,
  1394.     symbol.compound_stmt,
  1395.     symbol.expr_stmt,
  1396.     symbol.print_stmt,
  1397.     symbol.del_stmt,
  1398.     symbol.pass_stmt,
  1399.     symbol.break_stmt,
  1400.     symbol.continue_stmt,
  1401.     symbol.return_stmt,
  1402.     symbol.raise_stmt,
  1403.     symbol.import_stmt,
  1404.     symbol.global_stmt,
  1405.     symbol.exec_stmt,
  1406.     symbol.assert_stmt,
  1407.     symbol.if_stmt,
  1408.     symbol.while_stmt,
  1409.     symbol.for_stmt,
  1410.     symbol.try_stmt,
  1411.     symbol.suite,
  1412.     symbol.testlist,
  1413.     symbol.testlist_safe,
  1414.     symbol.test,
  1415.     symbol.and_test,
  1416.     symbol.not_test,
  1417.     symbol.comparison,
  1418.     symbol.exprlist,
  1419.     symbol.expr,
  1420.     symbol.xor_expr,
  1421.     symbol.and_expr,
  1422.     symbol.shift_expr,
  1423.     symbol.arith_expr,
  1424.     symbol.term,
  1425.     symbol.factor,
  1426.     symbol.power,
  1427.     symbol.atom]
  1428. if hasattr(symbol, 'yield_stmt'):
  1429.     _legal_node_types.append(symbol.yield_stmt)
  1430.  
  1431. _assign_types = [
  1432.     symbol.test,
  1433.     symbol.and_test,
  1434.     symbol.not_test,
  1435.     symbol.comparison,
  1436.     symbol.expr,
  1437.     symbol.xor_expr,
  1438.     symbol.and_expr,
  1439.     symbol.shift_expr,
  1440.     symbol.arith_expr,
  1441.     symbol.term,
  1442.     symbol.factor]
  1443. import types
  1444. _names = { }
  1445. for k, v in symbol.sym_name.items():
  1446.     _names[k] = v
  1447.  
  1448. for k, v in token.tok_name.items():
  1449.     _names[k] = v
  1450.  
  1451.  
  1452. def debug_tree(tree):
  1453.     l = []
  1454.     for elt in tree:
  1455.         if type(elt) == types.IntType:
  1456.             l.append(_names.get(elt, elt))
  1457.             continue
  1458.         if type(elt) == types.StringType:
  1459.             l.append(elt)
  1460.             continue
  1461.         l.append(debug_tree(elt))
  1462.     
  1463.     return l
  1464.  
  1465.